using PhraseCorrector.Common;
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Text;

namespace PhraseCorrector.DirectTanslate
{
    internal class FastTree
    {
        #region 局部变量
        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 存储单词及其对应含义的字典。
        /// </summary>
        private Dictionary<string, string> library { get; set; }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 定义查询范围的开始位置。
        /// </summary>
        private int Start { get; set; }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 定义查询范围的结束位置。
        /// </summary>
        private int End { get; set; }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 存储查询结果，包括开始位置、结束位置和单词。
        /// </summary>
        private List<(int start, int end, string word)> Result { get; set; }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 表示或设置标签的数组。
        /// 这个属性用于存储与对象相关的标签，以便于分类或标记。
        /// </summary>
        private string[] Tags { get; set; }
        #endregion

        #region 方法
        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 构造函数，初始化FastTree对象。
        /// </summary>
        /// <param name="dic">一个字典，用于存储词汇表。</param>
        public FastTree(Dictionary<string, string> dic)
        {
            library= dic;
            Result= new List<(int start, int end, string word)>();
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 查找所有可能的子串并进行分析。
        /// </summary>
        /// <param name="content">字符串数组，表示文本内容。</param>
        /// <returns>返回一个列表，包含所有分析出的词汇及其起止位置。</returns>
        private List<(int start, int end, string word)> FindAllA(string[] content)
        {
            for (Start= 0; Start < content.Length; Start++)
                FindEnd(content);
            return Result;
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 查找当前子串的可能结束位置。
        /// </summary>
        /// <param name="content">字符串数组，表示文本内容。</param>
        private void FindEnd(string[] content)
        {
            for (End= Start + 1; End <= content.Length; End++)
                Find(string.Join(' ', content[Start..End]));
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 对给定子串进行分析，判断是否为标点符号或词汇表中的词汇。
        /// </summary>
        /// <param name="subString">待分析的子串。</param>
        private void Find(string subString)
        {
            if (!Punctuation(subString, Utilities.IsPunctuation(subString) && subString.Length== 1))
                IsInlibrary(subString);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 判断给定子串是否为单个标点符号，并处理。
        /// </summary>
        /// <param name="subString">待判断的子串。</param>
        /// <param name="flag">布尔值，表示是否为单个标点符号。</param>
        /// <returns>返回一个布尔值，表示子串是否为单个标点符号。</returns>
        private bool Punctuation(string subString, bool flag)
        {
            if (flag) Result.Add((Start, End, subString));
            return flag;
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 判断给定子串是否在词汇表中。
        /// </summary>
        /// <param name="subString">待判断的子串。</param>
        private void IsInlibrary(string subString)
        {
            if (library.TryGetValue(subString.ToLower(), out string defined))
                InECliberay(subString, defined);
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 处理在词汇表中找到的词汇，并根据定义添加到结果列表中。
        /// </summary>
        /// <param name="subString">找到的词汇。</param>
        /// <param name="defined">词汇的定义。</param>
        private void InECliberay(string subString, string defined)
        {
            if (defined != "" && (Result.Count== 0 || End > Result[^1].end))
                Result.Add((Start, End, defined.Split('|')[0]));
        }

        // ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// 使用自定义词汇表转换输入列表中的词汇。
        /// </summary>
        /// <param name="inputList">输入的字符串列表。</param>
        /// <returns>返回一个字符串，表示转换后的结果。</returns>
        public string TransformCustomizedWords(string[] inputList)
        {
            Tags= new string[inputList.Length];
            foreach ((int start, int end, string word) in FindAllA(inputList))
                Tags[start]= word;

            return string.Join("", Tags);
        }

        #endregion
    }
}
